home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Mission 3
/
Mission 3.zip
/
Mission 3.iso
/
zugabe
/
va45
/
visual45
/
library
/
extend
/
library.s
< prev
next >
Wrap
Text File
|
1998-05-23
|
8KB
|
321 lines
; Les fonctions en tête sont incluses tout le temps ...
;------------------------------------------------------------------------------
; Method name : -
; Asm label : GWVA_COUNT_BYTES_0
; Description : Donne la taille d'une chaine terminée par 0
; Asm label : GWVA_COUNT_BYTES
; Description : Donne la taille d'une chaine terminée par la valeur de d0.b
;
; Rq : Ne touche aucun autre registre que d0
;
; in : a0.l = pointeur sur la chaine de caractère
; in : d1.b = terminateur de chaine (pour GWVA_COUNT_BYTES)
; out : d0.l = longueur de la chaine sans le caractère de fin
;
; 01/02/98 : Création
;------------------------------------------------------------------------------
GWVA_COUNT_BYTES_0:
clr.b d1
GWVA_COUNT_BYTES:
clr.l d0
.redo: cmp.b 0(a0,d0.l),d1
beq.s .fin
addq.l #1,d0
bra.s .redo
.fin: rts
;------------------------------------------------------------------------------
; Method name : -
; Asm label : GWVA_SET_PATH
; Description : Change le path/lecteur courant
;
; in : a0.l = pointeur sur le path voulu 'X:\PATH\',0
; out : d0.w = code de retour de la fonction dsetpath
;
; 16/05/98 : Création
;------------------------------------------------------------------------------
GWVA_SET_PATH:
clr d0
move.b (a0),d0
cmp.b #'Z',d0
bgt.s .minuscule
add.b #$20,d0
.minuscule:
sub.b #'a',d0
save.l a0
DSETDRV d0
load.l a0
DSETPATH 2(a0)
rts
*--------------------------------------------------------------------------*
*------------- Librairies indépendantes -----------------*
*--------------------------------------------------------------------------*
;------------------------------------------------------------------------------
; Method name : -
; Asm label : GWVA_AFFICH_HEXA
; Description : Affichage écran d'une chaine en hexadécimal depuis un registre
;
; in : d0.l = donnée à afficher
; in : d1.l = nombre de bits à afficher (multiple de 4)
;
; 09/02/98 : Création
;------------------------------------------------------------------------------
ifd LIB_HEXA
GWVA_AFFICH_HEXA: ; affichage hexa d'1 registre : d0=donnée d1=nb bits
sub #4,d1
move.l d0,d2 ; d1=nb bits
lsr.l d1,d2 ; d0=donnée
and.w #$f,d2
cmp #$a,d2
bge.s .lettr
add.b #'0',d2
bra.s .fin_lettr
.lettr: add.b #'A'-$a,d2
.fin_lettr: save.l d0-d2/a0
move.w d2,-(sp)
appel dos,2,4
load.l d0-d2/a0
tst d1
bgt.s GWVA_AFFICH_HEXA
rts
;------------------------------------------------------------------------------
; Method name : -
; Asm label : GWVA_STOCK_HEXA
; Description : Stocke une chaine depuis un registre en hexadécimal-ASCII en mémoire
;
; in : a1.l = destination de stockage
; in : d0.l = donnée à stocker
; in : d1.l = nombre de bits à prendre en compte (multiple de 4)
; out : -1(a1) = 0.b
;
; 09/02/98 : Création
;------------------------------------------------------------------------------
GWVA_STOCK_HEXA:
sub #4,d1
move.l d0,d2
lsr.l d1,d2
and.w #$f,d2
cmp #$a,d2
bge.s .lettr
add.b #'0',d2
bra.s .fin_lettr
.lettr: add.b #'A'-$a,d2
.fin_lettr: move.b d2,(a1)+
tst d1
bgt.s GWVA_STOCK_HEXA
clr.b (a1)+
rts
;------------------------------------------------------------------------------
; Method name : -
; Asm label : GWVA_HEXA2VALUE
; Description : Transforme une chaine hexa en valeur
;
; in : a0.l = pointe sur la chaine à transcrire
; in : d0.b = marque de fin de chaine
; out : -1(a0) = d0 si d7=GWVA_NO_ERROR_GENERIC
; out : d1.l = valeur en sortie
; out : d7.w = GWVA_NO_ERROR_GENERIC ou GWVA_ERROR_GENERIC si erreur dans la chaine
;
; 09/02/98 : Création
;------------------------------------------------------------------------------
GWVA_HEXA2VALUE:
clr.l d1
moveq #1,d3 ; signe
cmp.b #'-',(a0)
bne.s .pas_moins
neg d3
lea 1(a0),a0
.pas_moins: cmp.b #'+',(a0)
bne.s .pas_plus
lea 1(a0),a0
.pas_plus:
.redo: clr.l d2
move.b (a0)+,d2
cmp.b d2,d0
beq.s .fin
sub.b #'0',d2
bmi.s .erreur
cmp.b #9,d2
ble.s .number
sub.b #'A'-'0'-$a,d2
bmi.s .erreur
cmp.b #$f,d2
bgt.s .erreur
.letter:
.number: mulu.l #$10,d1 ; 68030 only
add.l d2,d1
bra.s .redo
.fin: tst d3
bge.s .resultat_positif
neg.l d1
.resultat_positif:
moveq #GWVA_NO_ERROR_GENERIC,d7
rts
.erreur: moveq #GWVA_ERROR_GENERIC,d7
rts
endc ; ifd LIB_HEXA
;------------------------------------------------------------------------------
; Method name : -
; Asm label : GWVA_STOCK_DECI
; Description : Stocke un registre signé en décimal-ASCII en mémoire
;
; in : a1.l = destination de stockage
; in : d0.l = donnée à stocker signée (8 décimales max)
; out : -1(a1) = 0.b
;
; 09/02/98 : Création
;------------------------------------------------------------------------------
ifd LIB_DECI
GWVA_STOCK_DECI:
move.l #10000000*10,d2 ; sur 8 décimales max
tst.l d0
bge.s .positif
move.b #'-',(a1)+
neg.l d0
.positif:
.until_frac0_1:
divul #10,d3:d2 ; reste:fraction
tst.l d2
beq.s .que_zeros
divul d2,d1:d0 ; reste:fraction
tst.b d0
bne.s .diff_0
move.l d1,d0
bra.s .until_frac0_1
.que_zeros: move.w #'0'*256,(a1)+
rts
.until_frac0_2:
divul #10,d3:d2 ; reste:fraction
tst.l d2
beq.s .fin_digit
divul d2,d1:d0 ; reste:fraction
.diff_0: add.b #'0',d0
move.b d0,(a1)+
move.l d1,d0 ; on redivise le reste
bra.s .until_frac0_2
.fin_digit: clr.b (a1)+
rts
;------------------------------------------------------------------------------
; Method name : -
; Asm label : GWVA_DECI2VALUE
; Description : Transforme une chaine décimale en valeur
;
; in : a0.l = pointe sur la chaine à transcrire
; in : d0.b = marque de fin de chaine
; out : -1(a0) = d0 si d7=GWVA_NO_ERROR_GENERIC
; out : d1.l = valeur en sortie
; out : d7.w = GWVA_NO_ERROR_GENERIC ou GWVA_ERROR_GENERIC si erreur dans la chaine
;
; 09/02/98 : Création
;------------------------------------------------------------------------------
GWVA_DECI2VALUE:
clr.l d1
moveq #1,d3 ; signe
cmp.b #'-',(a0)
bne.s .pas_moins
neg d3
lea 1(a0),a0
.pas_moins: cmp.b #'+',(a0)
bne.s .pas_plus
lea 1(a0),a0
.pas_plus:
.redo: clr.l d2
move.b (a0)+,d2
cmp.b d2,d0
beq.s .fin
sub.b #'0',d2
bmi.s .erreur
cmp.b #9,d2
bgt.s .erreur
mulu.l #10,d1 ; 68030 only
add.l d2,d1
bra.s .redo
.fin: tst d3
bge.s .resultat_positif
neg.l d1
.resultat_positif:
moveq #GWVA_NO_ERROR_GENERIC,d7
rts
.erreur: moveq #GWVA_ERROR_GENERIC,d7
rts
endc ; ifd LIB_DECI
ifd LIB_200HZ
;------------------------------------------------------------------------------
; Method name : -
; Asm label : GWVA_200HZ_GET_CURRENT_COUNTER
; Description : Pour récupérer en USER le compteur 200 Hz
;
; Rq : à executer en superviseur (SUPEXEC)
;
; out : GWVA_200HZ_CURRENT_COUNTER.l
;
; 15/02/98 : Création
;------------------------------------------------------------------------------
GWVA_200HZ_GET_CURRENT_COUNTER:
move.l cpt_200,GWVA_200HZ_CURRENT_COUNTER
rts
;------------------------------------------------------------------------------
; Method name : -
; Asm label : GWVA_200HZ_GET_DELAY_SINCE_LAST_CALL
; Description : Donne le délai en 200éme de seconde depuis le dernier appel
;
; Rq : faire clr.l GWVA_200HZ_OLD_COUNTER avant 1er appel
;
; out : d0.l = délai depuis le dernier appel en 200ème de seconde
;
; 15/02/98 : Création
;------------------------------------------------------------------------------
GWVA_200HZ_GET_DELAY_SINCE_LAST_CALL:
SUPEXEC GWVA_200HZ_GET_CURRENT_COUNTER
tst.l GWVA_200HZ_OLD_COUNTER
bne.s .compare
move.l GWVA_200HZ_CURRENT_COUNTER,GWVA_200HZ_OLD_COUNTER
clr.l d0
rts
.compare: move.l GWVA_200HZ_OLD_COUNTER,d0
sub.l GWVA_200HZ_CURRENT_COUNTER,d0
rts
BSS
GWVA_200HZ_OLD_COUNTER: ds.l 1
GWVA_200HZ_CURRENT_COUNTER: ds.l 1
TEXT
endc ; ifd LIB_200HZ
*--------------------------------------------------------------------------*